package com.taotao.manage.service;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.github.abel533.entity.Example;
import com.github.abel533.mapper.Mapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.manage.pojo.BasePojo;

/**
 * 通用service
 * @author 铭
 *
 */
public abstract class BaseService<T extends BasePojo> {
	/**
	 * 定义一个抽象方法，由子类实现该方法，返回具体的实现类。
	 * public abstract Mapper<T> getMapper();   spring4之前的做法 
	 * @return
	 */
	@Autowired
	private Mapper<T> mapper;
	
// 	1、queryById                  根据Id查询
//	2、queryAll			                   查询所有
//	3、queryOne                   根据一个条件查询一条数据
//	4、queryByWhere           根据一个条件查询一个集合
//	5、queryPageListByWhere       根据一个条件分页查询
//	6、save                       保存
//	7、update					    更新
//	8、deleteById				    通过id删除
//	9、deleteByIds                批量删除
//	10、deleteByWhere		            根据某个条件删除
	 
	/**
	 * 1.主键查询
	 * @param id  主键
	 * @return
	 */
	public T queryById(Long id) {
		return this.mapper.selectByPrimaryKey(id);
	}
	/**
	 * 2.查询所有数据
	 * @return 返回一个list集合
	 */
	public List<T> queryAll() {
		return this.mapper.select(null);
	}
	/**
	 * 3.根据条件查询一个对象
	 * @param record 对象实体
	 * @return  返回一个对象实体
	 */
	public T queryOne(T record) {
		return this.mapper.selectOne(record);
	}
	/**
	 * 4.根据一个条件查询一个集合
	 * @param record 实体对象
	 * @return 返回一个List集合
	 */
	public List<T> queryByWhere(T record) {	
		return this.mapper.select(record);
	}
	/**5.根据一个条件分页查询
	 * @param record 实体
	 * @param page 页码
	 * @param rows 每页显示数量
	 * @return
	 */
	public PageInfo<T> queryPageListByWhere(T record,Integer page,Integer rows) {
		PageHelper.startPage(page, rows,true);//设置分页参数
		//查询数据
		List<T> list =this.queryByWhere(record);
		return new PageInfo<T>(list);
	}
	/**
	 * 6.保存(新增)
	 * @param record
	 * @return
	 */
	public Integer save(T record) {
		record.setCreated(new Date());
		record.setUpdated(new Date());
		return this.mapper.insert(record);
	}
	/**
	 * 新增数据使用不为null的字段
	 * @param record
	 * @return
	 */
	public Integer saveSelective(T record) {
		record.setCreated(new Date());
		record.setUpdated(new Date());
		return this.mapper.insertSelective(record);
	}
	
	/**
	 * 7.根据主键更新
	 * @param record
	 * @return
	 */
	public Integer update(T record) {
		record.setUpdated(new Date());
		return this.mapper.updateByPrimaryKey(record);
	}
	/**
	 * 更新数据不为null的字段    (类里面含null，跳过)
	 * @param record
	 * @return
	 */
	public Integer updateSelective(T record) {
		record.setUpdated(new Date());
		return this.mapper.updateByPrimaryKeySelective(record);
	}
	/**
	 * 8.根据主键进行删除
	 * @param id
	 * @return
	 */
	public Integer deleteById(long id) {
		return this.mapper.deleteByPrimaryKey(id);
	}
	/**
	 * 9.批量删除
	 * @param ids
	 * @param property
	 * @param clazz
	 * @return
	 */
	public Integer deleteByIds(List<Object> ids,String property,Class<T> clazz) {
		Example example = new Example(clazz);
		example.createCriteria().andIn(property, ids);
		return this.mapper.deleteByExample(example);
	}
	/**
	 * 10.根据条件删除一个对象
	 * @param record
	 * @return
	 */
	public Integer deleteByWhere(T record) {
		return this.mapper.delete(record);
	}
	
	/**11.分页查询所有
	 * 
	 * @param page 页码
	 * @param rows 每页显示数量
	 * @return
	 */
	public PageInfo<T> queryPageList(Integer page,Integer rows) {
		PageHelper.startPage(page, rows,true);//设置分页参数
		//查询数据
		List<T> list =this.mapper.select(null);
		return new PageInfo<T>(list);
	}
	
	/**11.根据条件分页查询所有
	 * 
	 * @param page 页码
	 * @param rows 每页显示数量
	 * @return
	 */
	public PageInfo<T> queryPageListByExample(Example example,Integer page,Integer rows) {
		PageHelper.startPage(page, rows,true);//设置分页参数
		List<T> list =this.mapper.selectByExample(example);		
		return new PageInfo<T>(list);
	}
	/**
	 * 12.根据ids实现更新
	 * @param ids
	 * @param property
	 * @param clazz
	 * @return
	 */
	public Integer updateByIds(List<Object> ids,String property,T record) {
		Example example = new Example(record.getClass());
		example.createCriteria().andIn(property, ids);
		record.setUpdated(new Date());
		return this.mapper.updateByExampleSelective(record, example);
	}
	
}
